Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/storage_lock.py fa46dc4ce9ab50cbe66a7a9e4b3bca0140102345 (fa46dc4c) Text, 4.57 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787atexit
Tff7b72import T7ee787errno
Tff7b72import T7ee787os
Tff7b72import T7ee787sys


Tff7b72class T56d364StorageLockErrorTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Tff7b72pass


Tff7b72def Td2a8ff_pid_aliveTb4b4b4(Te6edf3pidTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3pid Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3pid Tff7b72== Te6edf3osTff7b72.Td2a8ffgetpidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffkillTb4b4b4(Te6edf3pidTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72except Tf85149ProcessLookupErrorTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72except Tf85149PermissionErrorTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True


Tff7b72def Td2a8ff_soft_lock_contestedTb4b4b4(Te6edf3other_pidTb4b4b4: Tffa657int Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Whether a soft PID lock should block acquire.

On platforms without flock (notably Android), process liveness probes are
unreliable across app restarts, so only treat the *current* PID as held.
Desktop soft-lock still uses kill(pid, 0) when flock is unsupported.
"""
Tff7b72if Te6edf3other_pid Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3other_pid Tff7b72== Te6edf3osTff7b72.Td2a8ffgetpidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff" Tff7b72or Ta5d6ff"Ta5d6ffANDROID_ROOTTa5d6ff" Tff7b72in Te6edf3osTff7b72.Td2a8ffenvironTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Te6edf3_pid_aliveTb4b4b4(Te6edf3other_pidTb4b4b4)


Tff7b72def Td2a8ff_flock_unsupportedTb4b4b4(Te6edf3excTb4b4b4: Tf85149BaseExceptionTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3excTb4b4b4, Tf85149NotImplementedErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3excTb4b4b4, Tf85149OSErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3unsupported Tff7b72= Tb4b4b4{Te6edf3errnoTff7b72.Td2a8ffENOSYSTb4b4b4, Te6edf3errnoTff7b72.Td2a8ffEOPNOTSUPPTb4b4b4}
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3errnoTb4b4b4, Ta5d6ff"Ta5d6ffENOTSUPTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3unsupportedTff7b72.Td2a8ffaddTb4b4b4(Te6edf3errnoTff7b72.Td2a8ffENOTSUPTb4b4b4)
Tff7b72return Te6edf3excTff7b72.Td2a8fferrno Tff7b72in Te6edf3unsupported


Tff7b72class T56d364StorageLockTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3storage_dirTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3storage_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflock_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Ta5d6ff"Ta5d6ff.meshchatx.lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_soft Tff7b72= Tff7b72False

Tff7b72def Td2a8ffacquireTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8fflock_pathTb4b4b4, Ta5d6ff"Ta5d6ffa+bTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72import T7ee787msvcrt

Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3msvcrtTff7b72.Td2a8fflockingTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3msvcrtTff7b72.Td2a8ffLK_NBLCKTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72import T7ee787fcntl

Tff7b72tryTb4b4b4:
Te6edf3fcntlTff7b72.Td2a8ffflockTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3fcntlTff7b72.Td2a8ffLOCK_EX Tff7b72| Te6edf3fcntlTff7b72.Td2a8ffLOCK_NBTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149OSErrorTb4b4b4, Tf85149NotImplementedErrorTb4b4b4) Tff7b72as Te6edf3excTb4b4b4:
Tff7b72if Tff7b72not Te6edf3_flock_unsupportedTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4:
Tff7b72raise
T8b949e# Android and some filesystems do not implement flock.
Tff7b72selfTff7b72.Td2a8ff_acquire_softTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_soft Tff7b72= Tff7b72True
Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Tff7b72selfTff7b72.Td2a8ffreleaseTb4b4b4)
Tff7b72return
Tff7b72except Te6edf3StorageLockErrorTb4b4b4:
Tff7b72raise
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72= Tff7b72None
Tff7b72raise Te6edf3StorageLockErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffAnother MeshChatX instance is already using storage at Tffd700{Tff7b72selfTff7b72.Td2a8ffstorage_dirTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72from T7ee787exc
Tff7b72selfTff7b72.Td2a8ff_write_pidTb4b4b4(Tb4b4b4)
Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Tff7b72selfTff7b72.Td2a8ffreleaseTb4b4b4)

Tff7b72def Td2a8ff_acquire_softTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72assert Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72is Tff7b72not Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3raw Tff7b72= Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Te6edf3other_pid Tff7b72= Tff7b72None
Tff7b72if Te6edf3rawTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3other_pid Tff7b72= Tffa657intTb4b4b4(Te6edf3rawTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffignoreTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Te6edf3other_pid Tff7b72= Tff7b72None
Tff7b72if Te6edf3_soft_lock_contestedTb4b4b4(Te6edf3other_pidTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72= Tff7b72None
Tff7b72raise Te6edf3StorageLockErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffAnother MeshChatX instance is already using storage at Tffd700{Tff7b72selfTff7b72.Td2a8ffstorage_dirTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_write_pidTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_write_pidTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72assert Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72is Tff7b72not Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8fftruncateTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffwriteTb4b4b4(Tffa657strTb4b4b4(Te6edf3osTff7b72.Td2a8ffgetpidTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffreleaseTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_softTb4b4b4:
Tff7b72pass
Tff7b72elif Te6edf3sysTff7b72.Td2a8ffplatform Tff7b72== Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72import T7ee787msvcrt

Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3msvcrtTff7b72.Td2a8fflockingTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3msvcrtTff7b72.Td2a8ffLK_UNLCKTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72import T7ee787fcntl

Te6edf3fcntlTff7b72.Td2a8ffflockTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3fcntlTff7b72.Td2a8ffLOCK_UNTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_softTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8fftruncateTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_handleTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_handle Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_soft Tff7b72= Tff7b72False


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────